package com.huangyi.adminservice.house.service.strategy;

import com.huangyi.adminapi.house.domain.dto.SearchHouseListReqDTO;
import com.huangyi.adminservice.house.domain.dto.HouseDTO;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 距离排序策略实现类
 * 
 * <p>根据房源与指定坐标点的距离进行升序排序，采用单例模式
 * 
 * @author huangyi
 * @version 1.0
 * @since 2024
 */
public class DistanceSortStrategy implements ISortStrategy {

    /** 单例实例 */
    private static final DistanceSortStrategy INSTANCE = new DistanceSortStrategy();

    /**
     * 私有构造函数
     */
    private DistanceSortStrategy() {}

    /**
     * 获取排序策略实例
     * 
     * @return 距离排序策略实例
     */
    public static DistanceSortStrategy getInstance() {
        return INSTANCE;
    }

    /**
     * 对房源列表按距离进行排序
     * 
     * @param houseDTOList 待排序的房源列表
     * @param reqDTO 搜索请求参数，包含目标经纬度
     * @return 按距离排序后的房源列表
     */
    @Override
    public List<HouseDTO> sort(List<HouseDTO> houseDTOList, SearchHouseListReqDTO reqDTO) {
        return houseDTOList.stream()
                .sorted(Comparator.comparingDouble(
                houseDTO -> houseDTO.calculateDistance(reqDTO.getLongitude(), reqDTO.getLatitude()))
                ).collect(Collectors.toList());
    }
}
